package jee.boot.oauth.standard.service;

import com.github.pagehelper.PageHelper;
import jee.boot.common.basic.Page;
import jee.boot.common.basic.interceptor.InterceptorRegister;
import jee.boot.common.properties.ProjectConfig;
import jee.boot.common.remote.RemoteEndpoint;
import jee.boot.common.utils.JsonMapper;
import jee.boot.entity.task.IexpTask;
import jee.boot.entity.auth.ModelData;
import jee.boot.entity.auth.StandardModel;
import jee.boot.entity.auth.standard.DataValue;
import jee.boot.oauth.standard.dao.StandardModelDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 标准模型数据交互
 */
@Service
public class StandardModelService {
    @Autowired
    private StandardModelDao dao;
    @Autowired
    private RemoteEndpoint remoteEndpoint;
    @Autowired
    private ProjectConfig projectConfig;
    @Autowired
    private InterceptorRegister interceptorRegister;

    public StandardModel get(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        entity.setModelData(modelData);
        entity.preQuery();
        Map<String, Object> map = dao.get(entity);
        entity.postQuery(map);
        entity.setDb(map);
        entity.db2data();
        return entity;
    }

    public Page<Map<String, DataValue>> findPage(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        entity.setModelData(modelData);
        Page<StandardModel> page = entity.getPage();
        if (page == null) {
            page = new Page<StandardModel>(1, 10);
            entity.setPage(page);
        }        if (page.getPageSize() < 0) {
            page.setPageSize(0);
        }
        entity.preQuery();
        Page<Map<String, DataValue>> pageData = new Page<>();
        com.github.pagehelper.Page<Map<String, DataValue>> startPage = PageHelper.startPage(page.getPageNo(), page.getPageSize(), true, true, true);
        List<Map<String, Object>> listData = dao.findList(entity);
        entity.postQuery(listData);
        entity.setDbList(listData);
        entity.dbList2dataList();
        pageData.setList(entity.getList());
        pageData.setCount(startPage.getTotal());
        pageData.setPageNo(startPage.getPageNum());
        pageData.setPageSize(startPage.getPageSize());
        return pageData;
    }

    public void save(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        entity.setModelData(modelData);
        entity.preInsert();
        entity.data2db();
        int flag = dao.insert(entity);
        entity.postInsert(flag);
    }

    public void update(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        entity.setModelData(modelData);
        entity.preUpdate();
        entity.data2db();
        int flag = dao.update(entity);
        entity.postUpdate(flag);
    }

    public void delete(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        entity.setModelData(modelData);
        entity.data2db();
        dao.delete(entity);
    }

    /**
     * 按模型名称查询模型定义
     *
     * @param code
     * @return
     */
    private ModelData getModelDataByCode(ModelData code) {
        ModelData modelData = remoteEndpoint.executePost(projectConfig.getOpenOauthServer(), "/modelData/getModelDataByCode", code, ModelData.class);
        return modelData;
    }

    /**
     * 导出数据
     * @param entity
     */
    public void exportData(StandardModel entity) {
        ModelData modelData = getModelDataByCode(entity.getModelData());
        IexpTask task = IexpTask.createNewExpTask("standardModelExport", JsonMapper.toJsonString(entity));
        task.setName(modelData.getName()+"数据导出");
        remoteEndpoint.executePost(projectConfig.getOpenTaskServer(),"/iexp/task/save",task,IexpTask.class);
    }
}
